package com.lzh.yjq;

import java.util.*;

/**
 * 寻找输入数组按指定顺序排序之后的前几项。输入一个长度不限
 * 的整数或者字符串数组，选择排序方式升序或者降序，以及输出项 k，将数
 * 组按照指定方式排序，输出前 k 项。
 * @author liuzhihao
 * @create 2021-10-10 12:37
 */
public class SortDemo {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>(); // 创建集合对象
        System.out.print("数组 ");
        Scanner sc = new Scanner(System.in); // 键盘输入
        String s = sc.nextLine(); // 从键盘接受字符串型

        SortDemo sortDemo = new SortDemo(); // new 一个SortDemo对象
        sortDemo.changeStrToInteger(list, s); // 将输入的字符串转换为数值型

        System.out.println("请输入的要排序后的前几项");
        int key = sc.nextInt(); // 输入输出项K
        System.out.printf("前%d项\n", key);

        // 判断输入的项是否符合要求
        if (key <= 0 || key > list.size()) { // 如果输入的项小于等于0，或者大于集合的长度
            System.out.println("你输入的不合法");
            while (true) {
                System.out.printf("请重新输入,有效范围为：[%d - %d]\n", 1 , list.size() );
                key = sc.nextInt(); // 重新输入
                if (key > 0 && key <= list.size()) {
                    break;
                }
            }
        }

        boolean loop = true; // 设置循环
        while (loop) {
            System.out.println("请输入你的排序方式(升序/逆序/退出)");
            String input = sc.next(); // 输入操作是升序还是逆序
            switch (input) {
                case "升序":
                    System.out.println("结果为：");
                    sortDemo.ascOrder(list, key); // 调用升序方法
                    break;
                case "逆序":
                    System.out.println("结果为：");
                    sortDemo.descOrder(list, key); // 调用逆序方法
                    break;
                case "退出":
                    sc.close();
                    loop = false;
                    break;
                default:
                    break;
            }

        }

    }

    /**
     * 将字符串转换为数值型，并存放在集合中
     */
    public void changeStrToInteger(List<Integer> list, String s) {
        String replaceAll = s.replaceAll("\\s*", ""); // 去除所有的空格
        String[] str = replaceAll.split(","); // 以逗号结尾分割，存入str数组
        int[] a = new int[str.length]; // new一个数组，和str数组一样的长度
        // 循环遍历数组a
        for (int i = 0; i < str.length; i++) {
            a[i] = Integer.parseInt(str[i]); // 将字符串类型转换为数值型
            list.add(a[i]); // 将数组添加到list集合中
        }
        // 如果不需要去重，则注释以下三行
        Set hashSet = new HashSet(list); // 将list集合放到Set集合中，去重
        list.clear(); // 清除集合中的内容
        list.addAll(hashSet); // 将set集合添加到list集合中
    }

    /**
     * 升序排序
     *
     * @param list 所输入的数组
     * @param key  所输入的前k项
     */
    public void ascOrder(List<Integer> list, int key) {
        Collections.sort(list); // 将list集合进行升序排序
        List<Integer> integerList = list.subList(0, key); // 截取集合0 - key的长度
        for (int out : integerList) { // 遍历集合输出
            System.out.println(out);
        }
    }

    /**
     * 逆序排序
     * @param list 所输入的数组
     * @param key  所输入的前k项
     */
    public void descOrder(List<Integer> list, int key) {
        Collections.sort(list); // 将list集合进行升序排序
        Collections.reverse(list); // 将list集合反转
        List<Integer> integerList = list.subList(0, key);// 截取集合0 - key的长度
        for (int out : integerList) {// 遍历集合输出
            System.out.println(out);
        }
    }


}
